<?php

/* * ************************************************************************* 
 * base.php 
 * Encoding : UTF-8
 * Desc. :SPIDER框架入口文件
 * Created on : 2013-4-23 10:45:07 by Aiden , aiden.ke@doosnet.net
 * Updated on : 2013-4-23 10:45:07 by Aiden , aiden.ke@doosnet.net
 * ************************************************************************* */

ini_set('max_execution_time','30');

define('IN_SPIDER', true);

//SPIDER框架路径
define('PC_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);

if (!defined('SPIDER_PATH'))
    define('SPIDER_PATH', PC_PATH . '..' . DIRECTORY_SEPARATOR);

//缓存文件夹地址
define('CACHE_PATH', SPIDER_PATH . 'caches' . DIRECTORY_SEPARATOR);

//主机协议
define('SITE_PROTOCOL', isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://');

//当前访问的主机名
define('SITE_URL', (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''));

//来源
define('HTTP_REFERER', isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');

//加载公用函数库
pc_base::load_sys_func('global');
pc_base::load_sys_func('extention');
pc_base::auto_load_func();

pc_base::load_config('system', 'errorlog') ? set_error_handler('my_error_handler') : error_reporting(E_ERROR | E_WARNING | E_PARSE);

//设置本地时差
function_exists('date_default_timezone_set') && date_default_timezone_set(pc_base::load_config('system', 'timezone'));

//系统开始时间
define('SYS_START_TIME', getmicrotime(TRUE));

define('CHARSET', pc_base::load_config('system', 'charset'));

//输出页面字符集
header('Content-type: text/html; charset=' . CHARSET);

define('SYS_TIME', time());

if (pc_base::load_config('system', 'gzip') && function_exists('ob_gzhandler')) {
    ob_start('ob_gzhandler');
} else {
    ob_start();
}

class pc_base {

    /**
     * 初始化应用程序
     */
    public static function creat_app() {
        return self::load_sys_class('application');
    }

    /**
     * 加载系统类方法
     * @param string $classname 类名
     * @param string $path 扩展地址
     * @param intger $initialize 是否初始化
     */
    public static function load_sys_class($classname, $path = '', $initialize = 1) {
        return self::_load_class($classname, $path, $initialize);
    }

    /**
     * 加载应用类方法
     * @param string $classname 类名
     * @param string $m 模块
     * @param intger $initialize 是否初始化
     */
    public static function load_app_class($classname, $m = '', $initialize = 1) {
        $m = empty($m) && defined('ROUTE_M') ? ROUTE_M : $m;
        if (empty($m))
            return false;
        return self::_load_class($classname, 'modules' . DIRECTORY_SEPARATOR . $m . DIRECTORY_SEPARATOR . 'classes', $initialize);
    }

    /**
     * 加载数据模型
     * @param string $classname 类名
     */
    public static function load_model($classname) {
        return self::_load_class($classname, 'model');
    }

    /**
     * 加载类文件函数
     * @param string $classname 类名
     * @param string $path 扩展地址
     * @param intger $initialize 是否初始化
     */
    private static function _load_class($classname, $path = '', $initialize = 1) {
        static $classes = array();
        if (empty($path))
            $path = 'libs' . DIRECTORY_SEPARATOR . 'classes';

        $key = md5($path . $classname);
        if (isset($classes[$key])) {
            if (!empty($classes[$key])) {
                return $classes[$key];
            } else {
                return true;
            }
        }
        if (file_exists(PC_PATH . $path . DIRECTORY_SEPARATOR . $classname . '.class.php')) {
            include PC_PATH . $path . DIRECTORY_SEPARATOR . $classname . '.class.php';
            $name = $classname;
            //是否有自己的扩展文件
            if ($my_path = self::my_path(PC_PATH . $path . DIRECTORY_SEPARATOR . $classname . '.class.php')) {
                include $my_path;
                $name = 'MY_' . $classname;
            }
            if ($initialize) {
                $classes[$key] = new $name;
            } else {
                $classes[$key] = true;
            }
            return $classes[$key];
        } else {
            return false;
        }
    }

    /**
     * 加载系统的函数库
     * @param string $func 函数库名
     */
    public static function load_sys_func($func) {
        return self::_load_func($func);
    }

    /**
     * 自动加载autoload目录下函数库
     * @param string $func 函数库名
     */
    public static function auto_load_func($path='') {
        return self::_auto_load_func($path);
    }

    /**
     * 加载应用函数库
     * @param string $func 函数库名
     * @param string $m 模型名
     */
    public static function load_app_func($func, $m = '') {
        $m = empty($m) && defined('ROUTE_M') ? ROUTE_M : $m;
        if (empty($m))
            return false;
        return self::_load_func($func, 'modules' . DIRECTORY_SEPARATOR . $m . DIRECTORY_SEPARATOR . 'functions');
    }

    /**
     * 加载商城函数库
     * @param string $func 函数库名
     * @param string $m 模型名
     */
    public static function load_mall_func($func, $m = '', $mallname='') {
        $m = empty($m) && defined('ROUTE_M') ? ROUTE_M : $m;
        if (empty($m))
            return false;

        if (empty($mallname))
            return false;
        
        return self::_load_func($func, 'modules' . DIRECTORY_SEPARATOR . $m . DIRECTORY_SEPARATOR . 'mall' . DIRECTORY_SEPARATOR . $mallname);
    }

    /**
     * 加载插件类库
     */
    public static function load_plugin_class($classname, $identification = '', $initialize = 1) {
        $identification = empty($identification) && defined('PLUGIN_ID') ? PLUGIN_ID : $identification;
        if (empty($identification))
            return false;
        return pc_base::load_sys_class($classname, 'plugin' . DIRECTORY_SEPARATOR . $identification . DIRECTORY_SEPARATOR . 'classes', $initialize);
    }

    /**
     * 加载插件函数库
     * @param string $func 函数文件名称
     * @param string $identification 插件标识
     */
    public static function load_plugin_func($func, $identification) {
        static $funcs = array();
        $identification = empty($identification) && defined('PLUGIN_ID') ? PLUGIN_ID : $identification;
        if (empty($identification))
            return false;
        $path = 'plugin' . DIRECTORY_SEPARATOR . $identification . DIRECTORY_SEPARATOR . 'functions' . DIRECTORY_SEPARATOR . $func . '.func.php';
        $key = md5($path);
        if (isset($funcs[$key]))
            return true;
        if (file_exists(PC_PATH . $path)) {
            include PC_PATH . $path;
        } else {
            $funcs[$key] = false;
            return false;
        }
        $funcs[$key] = true;
        return true;
    }

    /**
     * 加载插件数据模型
     * @param string $classname 类名
     */
    public static function load_plugin_model($classname, $identification) {
        $identification = empty($identification) && defined('PLUGIN_ID') ? PLUGIN_ID : $identification;
        $path = 'plugin' . DIRECTORY_SEPARATOR . $identification . DIRECTORY_SEPARATOR . 'model';
        return self::_load_class($classname, $path);
    }

    /**
     * 加载函数库
     * @param string $func 函数库名
     * @param string $path 地址
     */
    private static function _load_func($func, $path = '') {
        static $funcs = array();
        if (empty($path))
            $path = 'libs' . DIRECTORY_SEPARATOR . 'functions';
        $path .= DIRECTORY_SEPARATOR . $func . '.func.php';
        $key = md5($path);
        if (isset($funcs[$key]))
            return true;
        if (file_exists(PC_PATH . $path)) {
            include PC_PATH . $path;
        } else {
            $funcs[$key] = false;
            return false;
        }
        $funcs[$key] = true;
        return true;
    }

    /**
     * 加载函数库
     * @param string $func 函数库名
     * @param string $path 地址
     */
    private static function _auto_load_func($path = '') {
        if (empty($path))
            $path = 'libs' . DIRECTORY_SEPARATOR . 'functions' . DIRECTORY_SEPARATOR . 'autoload';
        $path .= DIRECTORY_SEPARATOR . '*.func.php';
        $auto_funcs = glob(PC_PATH . DIRECTORY_SEPARATOR . $path);
        if (!empty($auto_funcs) && is_array($auto_funcs)) {
            foreach ($auto_funcs as $func_path) {
                include $func_path;
            }
        }
    }

    /**
     * 是否有自己的扩展文件
     * @param string $filepath 路径
     */
    public static function my_path($filepath) {
        $path = pathinfo($filepath);
        if (file_exists($path['dirname'] . DIRECTORY_SEPARATOR . 'MY_' . $path['basename'])) {
            return $path['dirname'] . DIRECTORY_SEPARATOR . 'MY_' . $path['basename'];
        } else {
            return false;
        }
    }

    /**
     * 加载配置文件
     * @param string $file 配置文件
     * @param string $key  要获取的配置荐
     * @param string $default  默认配置。当获取配置项目失败时该值发生作用。
     * @param boolean $reload 强制重新加载。
     */
    public static function load_config($file, $key = '', $default = '', $reload = false) {
        static $configs = array();
        if (!$reload && isset($configs[$file])) {
            if (empty($key)) {
                return $configs[$file];
            } elseif (isset($configs[$file][$key])) {
                return $configs[$file][$key];
            } else {
                return $default;
            }
        }
        $path = CACHE_PATH . 'configs' . DIRECTORY_SEPARATOR . $file . '.php';
        if (file_exists($path)) {
            $configs[$file] = include $path;
        }
        if (empty($key)) {
            return $configs[$file];
        } elseif (isset($configs[$file][$key])) {
            return $configs[$file][$key];
        } else {
            return $default;
        }
    }

}